from functools import wraps

from support.redis_support import RedisSupport


# 封装幂等注解
def idempotent(key=None, expire=60):
    # 基于Redis封装幂等注解
    def decorator(func):
        @wraps(func)
        async def wrapper(*args, **kwargs):
            # 从Redis中获取幂等key
            redis_key = key
            if not redis_key:
                redis_key = func.__name__
            # 从Redis中获取幂等value
            redis_value = RedisSupport.__redis.get(redis_key)
            if redis_value:
                # 如果幂等value存在，则直接返回
                return redis_value
            else:
                # 如果幂等value不存在，则执行业务逻辑
                result = await func(*args, **kwargs)
                # 将业务逻辑结果存入Redis中
                RedisSupport.__redis.set(redis_key, result, expire)
                return result

        return wrapper
